package dataMining.DynamicTable;

import java.io.*;

/**
 * @author: cuiH
 * Date: 13-8-18
 * 数据的预处理，获取数据，进行填充
 */
public class PreProcess {
    static int sup = 0;
    static int prev = 1;
    static int next = 2;
    static int skip = 3;
    static int head = -1;

    void preProcess() throws IOException {
        //第一步，读取数据，存放于data中，获取支持度

        //原始数据表的存储，第一行和第一列都为空，目的：对应
        Boolean originalData[][] = new Boolean[Top_K.itemNumber + 1][Top_K.tranNumber + 1];
        int support[] = new int[Top_K.itemNumber + 1];

        //初始化.默认为零和false
        for (int i = 0; i < Top_K.itemNumber + 1; i++) {
            support[i] = 0;
            for (int j = 0; j < Top_K.tranNumber + 1; j++) {
                originalData[i][j] = false;
            }
        }

        //读取文件，赋值操作
        File inputFile = new File(Top_K.inputFile);                          //文件流
        FileReader fileReader = new FileReader(inputFile);                   //构造缓存
        BufferedReader bufferedReader = new BufferedReader(fileReader);      //文件存入缓存区域

        /*
        * 对填充所有数据的boolean表进行赋值
        * @param lineNumber 列号表示事务  rowNumber  行号表示itemID
        * step表示运行读了几次数据
        * 其中生成的二维表00行和列都是没用的
        * 而且uci数据集中换行前面还加有空格的ascii码，需要注意，也就是包含了两个字符
        * */
        int character;
        int lineNumber = 1;                                            //读取的时候表示transaction
        int rowNumber = 0;                                             // 表示itemId,item从一开始
        int step = 1;

        while ((character = bufferedReader.read()) != -1) {
            if (character == 32) {                                       //空格时候的情况
                step = 0;
                support[rowNumber]++;                                    //相应的支持度增加
                originalData[rowNumber][lineNumber] = true;
                rowNumber = 0;                                           //赋值完成后开始重新读取一个数了
            } else if (character == 10) {                                //换行回车时候的情况
                step = 0;
                lineNumber++;
            } else if (character == 13) {                                //因为bat中的换行最后字符是一个13（enter）+10（换行）
            } else {
                if (step == 1) {                                         //读取数据结束，此时为两位数
                    rowNumber = character - 48;
                } else {                                   //此时数据时三位数
                    rowNumber = rowNumber * 10 + (character - 48);
                }
            }
            step++;
        }
        bufferedReader.close();//读取数据解说

        //数据的输出部分
//        File outFile = new File(Top_K.outputFile);
//        FileWriter fileWriter = new FileWriter(outFile, true);
//        fileWriter.write("转化的数据集为：\r\n");
//        for (int i = 0; i <Top_K.itemNumber + 1; i++) {
//            fileWriter.write(support[i]+"  ");
//            for (int j = 0; j < Top_K.tranNumber + 1; j++) {
//                if(originalData[i][j]){
//                    fileWriter.write(1+"  ") ;
//                }  else {
//                    fileWriter.write(0 +"  ");
//                }
//            }
//            fileWriter.write(support[i]+"\r\n");
//        }
//        fileWriter.close();

        //第二步,进行插入表操作
        int lastPosition = 0;                                                  //定义最后一个support元素的位置 
        int nowPosition = 0;                                                   //记录data表中现在进行操作的位置
        Boolean isExceedK = false;

        //初始化操作，初始化第一个点
        Top_K.controller[0][sup] = support[1];
        Top_K.controller[0][prev]=head;
        Top_K.controller[0][next]=nowPosition+1;
        Top_K.controller[0][skip]=nowPosition+1;
        for(int i = 1;i< Top_K.tranNumber + 1;i++){                           //DATA赋值
            Top_K.DATA[0][i]=originalData[1][i];
        }
        Top_K.item[0][1]=true;                                                //附上项的数值
        nowPosition =  Top_K.controller[0][next];                              //更改下一个操作点的位置

        for (int i = 2; i < Top_K.itemNumber + 1; i++) {                     //读行

            //若插入位置不超过K，则进行如下操作
            if (!isExceedK) {
                //对于支持的操作，此时为直接获取
//                Top_K.controller[nowPosition][sup] = support[i];
                /*
                * 首先，找到比自己小的一个
                * 然后：插入其前面，即表动next和previous 此时（skip==previous）
                * 再然后：在该位置上面data，和赋值item
                * 最后：将下一个位置加1
                * */

                //找位置
                int nextPosition = 0;
                //比较了最后一个位置之前的所有位置
                while (nextPosition != lastPosition) {
                    //双向链表节点插入
                    if (Top_K.controller[nowPosition][sup] > Top_K.controller[nextPosition][sup]) {
                        Top_K.controller[nowPosition][prev] = Top_K.controller[nextPosition][prev];
                        Top_K.controller[nowPosition][next] = Top_K.controller[Top_K.controller[nextPosition][prev]][next];
                        Top_K.controller[Top_K.controller[nextPosition][prev]][next] = nowPosition;
                        Top_K.controller[nextPosition][prev]=nowPosition;
//                        if(nowPosition +1){
//
//                        }
                    }else{
                        nextPosition = Top_K.controller[nextPosition][next];
                    }
                }

            } else {                                                            //超过K的插入
                //比最后一个支持度大，判定是否需呀进行插入操作则进入插入操作
                if (support[i] > Top_K.controller[nowPosition][0]) {
                }

                for (int j = 1; j < Top_K.tranNumber + 1; j++) {
                    originalData[i][j] = false;
                }
            }
        }
    }
}
